package Dictionary;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Dictionary {

	 /**
     * 读取本地字典文件  加载字典数据   到Map
     * @param 文件名
     * @return Map<String,String[]>
     * @author wdj
     * */
    public  Map<String,String[]> loadDicToMap(String fileName) {
    	
        Map<String,String[]> map=new HashMap<String,String[]>();
        File file = new File(fileName);
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            int line = 1;
            // 一次读入一行，直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                // 显示行号
            	String temp[]=tempString.split(",");
            	String temp2[]=new String[temp.length-2];
            	System.arraycopy(temp, 2, temp2, 0, temp.length-2);
            	map.put(temp[1],temp2);
                line++;
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
		return map;
    }
    /**
     * 根据值取Map中值为value的key
     * @param 要查找的值
     * @return Object (List)
     * @author wdj
     * */
	@SuppressWarnings("unchecked")
	public Object getKey(Map map,Object value) {
		Object o=null;
		ArrayList all=new ArrayList();    //建一个数组用来存放符合条件的KEY值
	    /* 这里关键是那个entrySet()的方法,它会返回一个包含Map.Entry集的Set对象. Map.Entry对象有getValue和getKey的方法,利用这两个方法就可以达到从值取键的目的了 **/  
		Set set=map.entrySet();
		Iterator it=set.iterator();
		while(it.hasNext()) {
		   Map.Entry entry=(Map.Entry)it.next();
		   if(entry.getValue().equals(value)) {
		    o=entry.getKey();
		    all.add(o);          //把符合条件的项先放到容器中,下面再一次性打印出
		   }
		}
		return all;
	 }
	 /**
     * 根据拼音   取Map中拼音 为value的 字
     * @param 输入的拼音
     * @return List<String> 
     * @author wdj
     * */
   @SuppressWarnings("unchecked")
   public List<String> getKeyByValue(Map<String ,String[]> map,String value) {
	   List all=new ArrayList(); 
	   Set<String> keySet=(Set<String>) map.keySet();
	   for(String key:keySet){
			String values[]= (String[]) map.get(key);
			 for(String tempValue:values){
				 //把取出的拼音去掉声调与输入值对比  
				 if(tempValue.replaceAll("\\d*", "").indexOf(value.toLowerCase())!=-1){
					 all.add(key);
				 }
			 }
	   }
	   return all;
   }	    
   /**
    * 根据拼音   取Map中拼音 为value的 字
    * @param 输入的拼音
    * @return List<String> 
    * @author wdj
    * */
  @SuppressWarnings("unchecked")
  public List<String> getStringKeyByValue(Map<String ,String> map,String value) {
	   List all=new ArrayList(); 
	   Set<String> keySet=(Set<String>) map.keySet();
	   for(String key:keySet){
				 if((map.get(key)).indexOf(value)!=-1){
					 all.add(key);
			 }
	   }
	   return all;
  }	    
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
		  
		 Dictionary mvg=new Dictionary();
		 
         //Test Method	getKey();	
		 HashMap map=new HashMap();
		  map.put("1","a");
		  map.put("2","b");
		  map.put("3","c");
		  map.put("4","c");
		  map.put("5","e");
		  System.out.println(mvg.getKey(map,"c"));
		 
		//Test Method	getKeyByValue();	 
	 	 Map<String ,String[]> map2=mvg.loadDicToMap("UTF8Dic");
	 	 
	 	 for(String str:mvg.getKeyByValue(map2,"di")){
	 		System.out.println(str);
	     }
    }
   
} 

